..:: Menu ::.. ..:: Lekcja 4: Podstawy Object Pascala część: 10 ::.. ..::Info i Reklamy::..

Operowanie na łańcuchach

Wiesz już, że tekst możesz połączyć za pomocą operatora +. To nie wszystko. Przede wszystkim do łańcuchów możesz dodawać znaki ASCII. Zakładam, że wiesz co to są te znaki ASCII. Wstawia się je poprzedzając kod znakiem #. Np. znak ENTER ma kod 13 i jeżeli chcesz zrobić linię odstępu piszesz tak:
MessageBox(0, 'Pierwsza linia' + #13 + 'Druga linia', '', MB_OK);
Pewnie teraz powiesz: "Dobrze, ale skąd mam wiedzieć jaki numer posiada konkretny znak?". Skorzystaj z programu mojego autorstwa, który znajdziesz na dyskietce dołączonej do książki.
Możesz także mieć dostęp do poszczególnych znaków danego ciągu znaków. Wszystko za sprawą nawiasów klamrowych []:
var
Imie : String;
Znak : Char;

begin
Imie := 'Delphi';
Znak := Imie[1];
ShowMessage('Pierwsza linia mojego imienia to: ' + Znak);
end.
Zgadnij co zostanie wyświetlone w okienku? Tak, litera D.
Również deformacji z łańcuchami możesz dokonać stosując typ PChar. Oto przykład:
var
S : PChar;

begin
S := 'Delphi';
S := S + 1;
ShowMessage(S);
end.
Z wyglądu może to wydać się niezrozumiałe. Do zmiennej tekstowej dodałem cyfrę 1? W rzeczywistości zmniejszyłem długość tej zmiennej obcinając pierwszą literę. To możliwe jest tylko w typie PChar - String już tego nie umożliwia.
Deklarując zmienną typu String możesz określić z ilu znaków będzie się mogła max. składać. Robi sięto tak:
var
S : String[20];
W takim wypadku zmienna S będzie ciągiem znaków o max. długości 20.

Wskaźniki

Nie zawaham się powiedzieć, że wskaźniki to najbardziej skomplikowany element programowania dla początkujących programistów. Otóż wskaźnik wskazuje na adres zmiennej w pamięci. Ale zacznijmy od początku. Normalnie pamięć w Delphi przydzielana jest statycznie. Tzn., że w trakcie uruchamiania programu Windows "wie" ile dla niego przeznaczyć pamięci. Takie coś nosi nazwę Stosu.
Sterta jest to cała dostępna pamięć komputera.
Dzięki wskaźnikom możemy przydzielać pamięć dynamicznie w trakcie działania programu. Oto przykład:
type
TRec = record
Imie : String[20];
Nazwisko : String[20];
Kod : Word;
end;
PRec = ^TRec;

var
Rec : PRec;
begin
New(Rec); // przydzielamy pamięć dla rekordu

Rec^.Imie := 'Jan';
Rec^.Nazwisko := 'Kowalski';
Rec^.Kod := 00000;

Dispose(Rec); // zwalniamy pamięć
end.

Wskaźnik do danego obiektu można utworzyć za pomocą znaku ^. W tym wypadku stworzyliśmy rekord, a następnie stworzyliśmy wskaźnik do rekordu. Późnie deklarujemy zmienną, która jest typu PRec, czyli wskaźnikowego. Zanim rozpoczniemy przydzielanie danych do rekordu musimy przydzielić pamięć do rekordu. Później trzeba na końcu pamięć zwolnić za pomocą polecenia Dispose. Są jeszcze inne sposoby na przydzielanie pamięci, ale na razie nie zawracaj sobie tym głowy.
Tak jak napisałem wcześniej wskaźniki wskazują na adres pamięci, w której zapisana jest wartość danej zmiennej. Mając adres komórki pamięci możemy tę wartość zmienić.
var
I : Integer;
P : ^Integer;
begin I := 1; // przypisujemy wartość zmiennej
P := @I; // uzyskujemy komórkę pamięci, w której zapisana jest wartość zmiennej I
P^ := 2; // nadajemy nową wartość w komórce
{ teraz następuje wyświetlenie }
ShowMessage('Zmienna I po modifikacji ma wartość: ' + IntToStr(i));
end.

Jeżeli chcemy odczytać wartość danej zmiennej to kompilator odczytuje wartość komórki, w której dana zmienna jest zapisana. Przy pomocy takiego zapisu:
P := @I;
Otrzymujemy adres komórki pamięci, w której zapisana jest zmienna I. Adres ten zapisany jest do wskaźnika P. Teraz w tej komórce chcesz wpisać nową wartość - robisz tak:
P^ := 2; // znak ^ jest potrzebny gdyż jest to wskaźnik!
<--- Wstecz

   
©Copyright by garUs